package com.atguigu.des;

import com.sun.org.apache.xml.internal.security.utils.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class DesAesDemo {

    public static void main(String[] args) throws Exception{

        // 原文
        String input = "晴天";
        // des加密必须是8位
        String key = "87654321";
        // 算法
        String algorithm = "DES";

      //  String transformation = "DES/ECB/PKCS5Padding";  默认模式
        String transformation = "DES/CBC/PKCS5Padding"; //CBC要添加一个iv向量参数，且必须是8个字节

        String encryptDES=encryptDES(input,key,transformation,algorithm);
        System.out.println("加密："+encryptDES);

        //把encryptDES作为解密的原文
        String decryptDES=decryptDES(encryptDES,key,transformation,algorithm);
        System.out.println("解密:"+decryptDES);



    }

    /**
     * 使用DES加密数据
     *
     * @param input          : 原文
     * @param key            : 密钥(DES,密钥的长度必须是8个字节)
     * @param transformation : 获取Cipher对象的算法
     * @param algorithm      : 获取密钥的算法
     * @return : 密文
     * @throws Exception
     */
    private static  String encryptDES
    (String input,String key,String transformation,String algorithm) throws  Exception{

        //获取一个对象
        Cipher cipher = Cipher.getInstance(transformation);
        //创建规则（密钥和算法）
        SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
        IvParameterSpec iv = new IvParameterSpec("87654321".getBytes());
        //初始化机密模式
        cipher.init(Cipher.ENCRYPT_MODE,sks,iv);
        //加密
        byte[] bytes = cipher.doFinal(input.getBytes());

        //加密之后
        String encode = Base64.encode(bytes);

        return encode;
    }


    private static  String decryptDES
            (String input,String key,String transformation,String algorithm) throws  Exception{

        //获取一个对象
        Cipher cipher = Cipher.getInstance(transformation);
        //创建规则（密钥和算法）
        SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);

        IvParameterSpec iv = new IvParameterSpec("87654321".getBytes());
        //初始化机密模式
        cipher.init(Cipher.DECRYPT_MODE,sks,iv);
        //  解密，上面使用的base64编码，下面直接用密文
        byte[] bytes = cipher.doFinal(Base64.decode(input));
        //  因为是明文，所以直接返回
        return new String(bytes);




    }
}
